package com.smartens.boit.util;

import android.content.Context;
import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

import java.util.ArrayList;

/**
 * @Description
 * @Author cuihe
 * @Date 20210512
 */
public class LineChartUtils {
    Context context;
    LineChart lineChart;

    private ArrayList<Entry> list1 = new ArrayList<>();  //数据集合
    private ArrayList<Entry> list2 = new ArrayList<>();  //数据集合
    private ArrayList<Entry> list3 = new ArrayList<>();  //数据集合

    private LineDataSet set;
    private LineDataSet set1;
    private LineDataSet set2;

    private float min,max,ganularity;

    ArrayList<String> timeList = new ArrayList<String>();

    //颜色 list
    private static final String[] colorList = {"#FF9802", "#05B8F5", "#367FE7"};

    public LineChartUtils(Context context, ArrayList<Entry> list1, ArrayList<Entry> list2, ArrayList<Entry> list3, ArrayList<String> timeList, LineChart lineChart,float min,float max,float ganularity) {
        this.context = context;
        this.list1 = list1;
        this.list2 = list2;
        this.list3 = list3;
        this.timeList = timeList;
        this.lineChart = lineChart;
        this.min=min;
        this.max=max;
        this.ganularity=ganularity;
        setData(list1, list2, list3);
    }

    private void setData(ArrayList<Entry> list1, ArrayList<Entry> list2, ArrayList<Entry> list3) {
        // 图例
        setLegend();
        // X轴相关
        setXAxis();
        // Y轴相关
        setYAxis(min,max,ganularity);

        // 画 线
        set = new LineDataSet(list1, "A相");
        setLine(set, colorList[0]);
        set1 = new LineDataSet(list2, "B相");
        setLine(set1, colorList[1]);
        set2 = new LineDataSet(list3, "C相");
        setLine(set2, colorList[2]);

        //创建一个数据集
        ArrayList<ILineDataSet> dataSets = new ArrayList<>();
        dataSets.add(set);
        dataSets.add(set1);
        dataSets.add(set2);

        LineData data = new LineData(dataSets);
        //设置数据
        lineChart.setData(data);
        //隐藏图表右下角显示内容
        Description description = new Description();
        description.setEnabled(false);
        lineChart.setDescription(description);
        //禁止拖拽
        lineChart.setDragEnabled(false);
        //X轴或Y轴禁止缩放
        lineChart.setScaleXEnabled(false);
        lineChart.setScaleYEnabled(false);
        lineChart.setScaleEnabled(false);
        //禁止所有事件
        lineChart.setTouchEnabled(false);
    }

    /**
     * 图例
     */
    private void setLegend() {
        // 图例
        Legend legend = lineChart.getLegend();
        // 设置位置
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        // 不在图里面显示
        legend.setDrawInside(false);
        // 图例的样式
        legend.setForm(Legend.LegendForm.CIRCLE);
        legend.setFormSize(7f);
        legend.setTextSize(11f);

        // 字体 样式
        legend.setTextColor(Color.parseColor("#555555"));
        //设置图例标签到文字之间的距离
        legend.setFormToTextSpace(3f);
        // 图例之间的间距
        legend.setXEntrySpace(20f);
        // 垂直距离
        legend.setYOffset(20);
    }

    /**
     * 设置 X 轴 相关
     */
    private void setXAxis() {
        // 去掉 纵向网格线
        lineChart.getXAxis().setDrawGridLines(false);

        //设置x轴网格线
        XAxis xAxis = lineChart.getXAxis();
        // 设置Y轴坐标的个数，不是精确值，如果强制设置，可能导致轴线不均匀
        // xAxis.setLabelCount(6, true);
        xAxis.setLabelCount(3,true);

        // 设置x轴之间的最小间隔。用于在图表放大后标签不至于重合
        xAxis.setGranularity(10f);
        // 设置x轴轴线的宽度
        xAxis.setAxisLineWidth(1f);
        // 设置轴线的颜色
        xAxis.setAxisLineColor(Color.parseColor("#A4A4A4"));
        // 设置坐标颜色
        xAxis.setTextColor(Color.parseColor("#A4A4A4"));

        // 设置x轴显示位置在底部
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        // 禁止图表或屏幕的边缘的第一个和最后一个轴中的标签条目被裁剪
        xAxis.setAvoidFirstLastClipping(true);
//        xAxis.setCenterAxisLabels(true);
        // 格式化 x轴坐标
        xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                System.out.println("value:"+(int) value);
                // 转为 index
                int index= ((int) value);
                if(index>=0 && index<timeList.size()){
                    return timeList.get(index);
                }
                else{
                    return "";
                }

            }
        });
    }

    /**
     * 设置 Y 轴 相关
     */
    private void setYAxis(float minimum,float maximum,float ganularity) {
        // 去掉右侧 的坐标轴
        lineChart.getAxisRight().setEnabled(false);
        //设置 Y Left 值标签间隔
        if(ganularity==50f){
            lineChart.getAxisLeft().setGranularity(ganularity);
        }

        //设置Y轴网格线
        YAxis yAxis = lineChart.getAxisLeft();

        // horizontal grid lines
        yAxis.enableGridDashedLine(10f, 10f, 0f);

        // axis range
        if(maximum==250f){
            yAxis.setAxisMaximum(maximum);
        }
//        yAxis.setAxisMaximum(maximum);
        yAxis.setAxisMinimum(minimum);

        // 设置Y轴坐标的个数
        yAxis.setLabelCount(6);

        // 设置轴线的颜色
        yAxis.setAxisLineColor(Color.parseColor("#EdEdEd"));

        // 设置坐标颜色
        yAxis.setTextColor(Color.parseColor("#A4A4A4"));

    }

    /**
     * 画线
     *
     * @param set
     * @param color 线条颜色
     */
    private void setLine(LineDataSet set, String color) {
        //设置线条的颜色
        set.setColor(Color.parseColor(color));

        //设置 是否显示 折线的点
        set.setDrawCircles(false);

        // 设置是否显示点 值
        set.setDrawValues(false);

        // 设置是否填充 面积
        set.setDrawFilled(true);
        // 面积填充
        set.setFillColor(Color.parseColor("#EEF5FF"));
    }

}